package controller;

import java.text.SimpleDateFormat;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import model.Filme;
import model.FilmesModel;
import model.Sala;
import model.SalasModel;
import model.Sessao;
import model.SessoesModel;
import view.CinemaView;
import view.FilmeView;
import view.SalaView;
import view.SessaoView;

/**
 * @author Lucas Amaral
 */
public class CinemaController {
    private CinemaView view;
    private SalasModel modelSala;
    private SessoesModel modelSessão;
    private FilmesModel modelFilme;
    
    public CinemaController(CinemaView v, SalasModel ms, SessoesModel me, FilmesModel mf) {
        view = v;
        modelSala = ms;
        modelSessão = me;
        modelFilme = mf;
    }
    
    public void consultarSalas() {
        DefaultTableModel model=((DefaultTableModel) view.jTableTabelaResultado.getModel());
        int linha=0;
        model.setRowCount(0);
        model.setColumnCount(0);
        model.addColumn("Numero");
        model.addColumn("Capacidade");
        for (Sala sala: modelSala.getSalas().values()) {
            model.addRow(new String[] {});
            view.jTableTabelaResultado.setValueAt(sala.getNumero(), linha, 0);
            view.jTableTabelaResultado.setValueAt(sala.getCapacidade(), linha, 1);
            linha++;
        }
    }
    
    public void consultarFilmes() {
        DefaultTableModel model=((DefaultTableModel) view.jTableTabelaResultado.getModel());
        int linha=0;
        model.setRowCount(0);
        model.setColumnCount(0);
        model.addColumn("Nome");
        model.addColumn("Status");
        for (Filme filme: modelFilme.getFilmes().values()) {
            model.addRow(new String[] {});
            view.jTableTabelaResultado.setValueAt(filme.getNome(), linha, 0);
            if (filme.getEmCartaz()) {
                view.jTableTabelaResultado.setValueAt("Em cartaz", linha, 1);
            } else {
                view.jTableTabelaResultado.setValueAt("Fora de exibição", linha, 1);
            }
            linha++;
        }
    }
        
    public void consultarSessoes() {
        DefaultTableModel model=((DefaultTableModel) view.jTableTabelaResultado.getModel());
        int linha=0;
        model.setRowCount(0);
        model.setColumnCount(0);
        model.addColumn("Id sessão"); 
        model.addColumn("Numero sala");
        model.addColumn("Filme");
        model.addColumn("Data");
        model.addColumn("Ingressos vendidos"); 
        for (Sessao sessao: modelSessão.getSessões()) {
            model.addRow(new String[] {});
            view.jTableTabelaResultado.setValueAt(sessao.getId(), linha, 0);
            view.jTableTabelaResultado.setValueAt(sessao.getSala().getNumero(), linha, 1);
            view.jTableTabelaResultado.setValueAt(sessao.getFilme().getNome(), linha, 2);
            view.jTableTabelaResultado.setValueAt(new SimpleDateFormat("dd/MM/yyyy hh:mm").format(sessao.getData()), linha, 3);
            view.jTableTabelaResultado.setValueAt(sessao.getQtdIngressosVendidos(), linha, 4);
            linha++;
        }
    }
    
    public Sessao buscarSessao(Integer idSessão) {
        for (Sessao sessão: modelSessão.getSessões()) {
            if (sessão.getId() == idSessão) {
                return sessão;
            }
        }
        return null;
    }
    
    public Filme buscarFilme(String nomeFilme) {
        for (Filme filme: modelFilme.getFilmes().values()) {
            if (filme.getNome().equals(nomeFilme)) {
                return filme;
            }
        }
        return null;
    }
    
    public Sala buscarSala(Integer numeroSala) {
        for (Sala sala: modelSala.getSalas().values()) {
            if (sala.getNumero() == numeroSala) {
                return sala;
            }
        }
        return null;
    }
    
    public void excluir(Object celula) {
        if (view.jTableTabelaResultado.getColumnName(0).equals("Numero")) {
            Sala sala = buscarSala((Integer) celula);
            if (!objetoPossuiSessão(sala)) {    
                modelSala.excluirSala(sala);
                consultarSalas();
            } else {
                JOptionPane.showMessageDialog(view, "Impossível excluir sala, existem sessões cadastradas com esta sala.");
            }
        } else if (view.jTableTabelaResultado.getColumnName(0).equals("Nome")) {
            Filme filme = buscarFilme((String) celula);
            if (!objetoPossuiSessão(filme)) {
                modelFilme.excluirFilme(filme);
                consultarFilmes();
            } else {
                JOptionPane.showMessageDialog(view, "Impossível excluir filme, existem sessões cadastradas com este filme.");
            }
        } else {
            Sessao sessão = buscarSessao((Integer) celula);
            modelSessão.excluirSessão(sessão);
            consultarSessoes();
        }
    }
    
    public void alterar(Object celula) {
        if (view.jTableTabelaResultado.getColumnName(0).equals("Numero")) {
            Sala sala = buscarSala((Integer) celula);  
            SalaView viewSala = new SalaView(modelSala, sala);
            viewSala.setVisible(true);
        } else if (view.jTableTabelaResultado.getColumnName(0).equals("Nome")) {
            Filme filme = buscarFilme((String) celula);
            FilmeView viewFilme = new FilmeView(modelFilme, filme);
            viewFilme.setVisible(true);
        } else {
            Sessao sessão = buscarSessao((Integer) celula);
            SessaoView viewSessão = new SessaoView(modelSessão, sessão);
            viewSessão.setVisible(true);
        }
    }
    
    public Boolean objetoPossuiSessão(Object objeto) {
        if (objeto instanceof Filme) {
            for (Sessao sessão: modelSessão.getSessões()) {
                if (sessão.getFilme().equals((Filme) objeto)) {
                    return true;
                }
            }
        } else if (objeto instanceof Sala) {
            for (Sessao sessão: modelSessão.getSessões()) {
                if (sessão.getSala().equals((Sala) objeto)) {
                    return true;
                }
            }
        }
        return false;
    }
}
